package com.mailbox.mailbox.util.SessionChek;

import com.mailbox.mailbox.util.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

/**
 * 功能: 注解实现类
 *
 * @author : zhouzhaodong
 * @version : 1.0
 * @date : 2021/6/28 16:09
 */
@Component
@Aspect
@Slf4j
public class AspectJ {

    @Resource
    HttpServletRequest request;
    @Pointcut("@annotation(com.mailbox.mailbox.util.SessionChek.SessionChek)")
    public void annotationPointCut() {
    }


    /**
     * 环绕通知：
     * 环绕通知非常强大，可以决定目标方法是否执行，什么时候执行，执行时是否需要替换方法参数，执行完毕是否需要替换返回值。
     * 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型
     */
    @Around(value = "annotationPointCut()")
    public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
        try {
            //获取session
            HttpSession session   =   request.getSession();
            // 获取session中所有的键值
            Enumeration<String> attrs = session.getAttributeNames();
            // 遍历attrs中的session
            if(!attrs.hasMoreElements()){
                return ResponseResult.error("用户未登录");
            }else{
                //放行
                System.out.println(request.getHeaderNames());
              return  proceedingJoinPoint.proceed();
            }
        } catch (Throwable throwable) {
            log.info("检验登录异常了(sessionChek)!!!!");
            throwable.printStackTrace();
        }
        log.info("验证session失败");
        return ResponseResult.error("服务器繁忙,请稍后再试");
    }

}